#ifndef __KEY_H
#define __KEY_H

#include "User.h"
#include "header.h"

// #define	IN_KEY1      P32; 	// 输入鼠尾开关1 按下开启，抬起关闭，双击开启与关闭切换
// #define	IN_KEY2      P33; 	// 输入鼠尾开关2 按下开启，抬起关闭，双击开启与关闭切换
// #define	IN_KEY3      P36; 	// 输入主板按键开关

// #define IN_KEY1 P36
// #define IN_KEY5 P33
// #define IN_KEY6 P32

#define CNT_SHORT_MIN 3
#define CNT_LONG_MIN 300
#define CNT_UP_MIN 3
#define CNT_MulTap_INTERVAL 55

#define KEY_FIFO_SIZE 10


typedef enum KEYNUMBER {
    KEYNUM_NULL = 0,

    KEYNUM_0_DOWN = 1,      /* 0键按下 */
    KEYNUM_0_UP,            /* 0键弹起 */
    KEYNUM_0_LONG,          /* 0键长按 */
    KEYNUM_0_LONGUP,        /* 0键长按弹起 */
    KEYNUM_0_SINGLE,        /* 0键单击 */
    KEYNUM_0_DOUBLE,        /* 0键双击 */

    KEYNUM_1_DOWN,          /* 1键按下 */
    KEYNUM_1_UP,            /* 1键弹起 */
    KEYNUM_1_LONG,          /* 1键长按 */
    KEYNUM_1_LONGUP,        /* 1键长按弹起 */
    KEYNUM_1_SINGLE,        /* 1键单击 */
    KEYNUM_1_DOUBLE,        /* 1键双击 */

    KEYNUM_2_DOWN,          /* 2键按下 */
    KEYNUM_2_UP,            /* 2键弹起 */
    KEYNUM_2_LONG,          /* 2键长按 */
    KEYNUM_2_LONGUP,        /* 2键长按弹起 */
    KEYNUM_2_SINGLE,        /* 2键单击 */
    KEYNUM_2_DOUBLE,        /* 2键双击 */

    KEYNUM_3_DOWN,          /* 3键按下 */
    KEYNUM_3_UP,            /* 3键弹起 */
    KEYNUM_3_LONG,          /* 3键长按 */
    KEYNUM_3_LONGUP,        /* 3键长按弹起 */
    KEYNUM_3_SINGLE,        /* 3键单击 */
    KEYNUM_3_DOUBLE,        /* 3键双击 */

    KEYNUM_4_DOWN,          /* 4键按下 */
    KEYNUM_4_UP,            /* 4键弹起 */
    KEYNUM_4_LONG,          /* 4键长按 */
    KEYNUM_4_LONGUP,        /* 4键长按弹起 */
    KEYNUM_4_SINGLE,        /* 4键单击 */
    KEYNUM_4_DOUBLE,        /* 4键双击 */

    KEYNUM_5_DOWN,          /* 5键按下 */
    KEYNUM_5_UP,            /* 5键弹起 */
    KEYNUM_5_LONG,          /* 5键长按 */
    KEYNUM_5_LONGUP,        /* 5键长按弹起 */
    KEYNUM_5_SINGLE,        /* 5键单击 */
    KEYNUM_5_DOUBLE,        /* 5键双击 */

    KEYNUM_6_DOWN,          /* 6键按下 */
    KEYNUM_6_UP,            /* 6键弹起 */
    KEYNUM_6_LONG,          /* 6键长按 */
    KEYNUM_6_LONGUP,        /* 6键长按弹起 */
    KEYNUM_6_SINGLE,        /* 6键单击 */
    KEYNUM_6_DOUBLE,        /* 6键双击 */
    KEYNUM_TEST

} keynumber_t;

typedef struct {
    /* 下面是一个函数指针，指向判断按键手否按下的函数 */
    unsigned int Count;
    unsigned char UpCount;   /* 滤波器计数器 */
    unsigned char State;     /* 按键当前状态（按下还是弹起） */
    unsigned char LongState; /* 按键是否长按 (处于长按中还是非长按)*/
    unsigned char ACTIVE_LEVEL; /* 按键有效电平，0表示低电平有效，1表示高电平有效 */
    unsigned int MulTapCount;  /* 记录上一次按键按下的时间 */
    unsigned char MulTapTimes; /* 按键连击记录 */
    unsigned char DoubleState;  //本次按键是否执行了双击动作。
} KEY_T;

/* 按键FIFO用到变量 */

typedef struct {
    uint8_t Buf[KEY_FIFO_SIZE]; /* 键值缓冲区 */
    uint8_t Read;   /* 缓冲区读指针1 */
    uint8_t Write;  /* 缓冲区写指针 */
} KEY_FIFO_T;



/* 供外部调用的函数声明 */
void bsp_PutKey(uint8_t _KeyCode);
uint8_t bsp_GetKey(void);
void bsp_ClearKey(void);
void bsp_KeyScan(void);
void bsp_keyInit(void);
unsigned char bsp_Selector_Scan_ILL(void); // 扫描照明旋钮
unsigned char bsp_Selector_Scan_AIM(void); // 扫描瞄准器旋钮


#endif
